package com.bank.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bank.dto.Result;
import com.bank.entity.CustomerCardView;
import com.bank.entity.TradeDetailView;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 视图查询服务接口
 * 提供对数据库视图的业务操作
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2025-06-19
 */
public interface ViewService {

    // ================================
    // 客户银行卡视图查询
    // ================================

    /**
     * 查询所有客户银行卡视图数据
     * 
     * @return 客户银行卡视图列表
     */
    Result<List<CustomerCardView>> getAllCustomerCards();

    /**
     * 分页查询客户银行卡视图数据
     * 
     * @param page 分页参数
     * @param customerName 客户姓名（可选，模糊查询）
     * @param savingName 存款类型（可选，模糊查询）
     * @param isReportLoss 是否挂失（可选）
     * @param startDate 开卡开始日期（可选）
     * @param endDate 开卡结束日期（可选）
     * @param minBalance 最小余额（可选）
     * @param maxBalance 最大余额（可选）
     * @return 分页结果
     */
    Result<IPage<CustomerCardView>> getCustomerCardsPage(Page<CustomerCardView> page,
                                                        String customerName,
                                                        String savingName,
                                                        String isReportLoss,
                                                        LocalDate startDate,
                                                        LocalDate endDate,
                                                        BigDecimal minBalance,
                                                        BigDecimal maxBalance);

    /**
     * 根据客户姓名查询客户银行卡视图
     * 
     * @param customerName 客户姓名
     * @return 客户银行卡视图列表
     */
    Result<List<CustomerCardView>> getCustomerCardsByName(String customerName);

    /**
     * 根据存款类型查询客户银行卡视图
     * 
     * @param savingName 存款类型
     * @return 客户银行卡视图列表
     */
    Result<List<CustomerCardView>> getCustomerCardsBySavingType(String savingName);

    /**
     * 导出客户银行卡视图数据到CSV
     *
     * @return CSV文件内容
     */
    Result<String> exportCustomerCardsToCSV();

    /**
     * 导出客户银行卡视图数据到CSV（带过滤条件）
     *
     * @param customerName 客户姓名（可选，模糊查询）
     * @param savingName 存款类型（可选，模糊查询）
     * @param isReportLoss 是否挂失（可选）
     * @param startDate 开卡开始日期（可选）
     * @param endDate 开卡结束日期（可选）
     * @param minBalance 最小余额（可选）
     * @param maxBalance 最大余额（可选）
     * @return CSV文件内容
     */
    Result<String> exportCustomerCardsToCSV(String customerName,
                                           String savingName,
                                           String isReportLoss,
                                           LocalDate startDate,
                                           LocalDate endDate,
                                           BigDecimal minBalance,
                                           BigDecimal maxBalance);

    // ================================
    // 交易明细视图查询
    // ================================

    /**
     * 查询所有交易明细视图数据
     * 
     * @return 交易明细视图列表
     */
    Result<List<TradeDetailView>> getAllTradeDetails();

    /**
     * 分页查询交易明细视图数据
     * 
     * @param page 分页参数
     * @param cardId 卡号（可选，精确查询）
     * @param customerName 客户姓名（可选，模糊查询）
     * @param tradeType 交易类型（可选）
     * @param startTime 交易开始时间（可选）
     * @param endTime 交易结束时间（可选）
     * @param minAmount 最小金额（可选）
     * @param maxAmount 最大金额（可选）
     * @return 分页结果
     */
    Result<IPage<TradeDetailView>> getTradeDetailsPage(Page<TradeDetailView> page,
                                                      String cardId,
                                                      String customerName,
                                                      String tradeType,
                                                      LocalDateTime startTime,
                                                      LocalDateTime endTime,
                                                      BigDecimal minAmount,
                                                      BigDecimal maxAmount);

    /**
     * 根据卡号查询交易明细视图
     * 
     * @param cardId 卡号
     * @return 交易明细视图列表
     */
    Result<List<TradeDetailView>> getTradeDetailsByCardId(String cardId);

    /**
     * 根据客户姓名查询交易明细视图
     * 
     * @param customerName 客户姓名
     * @return 交易明细视图列表
     */
    Result<List<TradeDetailView>> getTradeDetailsByCustomerName(String customerName);

    /**
     * 根据交易类型查询交易明细视图
     * 
     * @param tradeType 交易类型
     * @return 交易明细视图列表
     */
    Result<List<TradeDetailView>> getTradeDetailsByType(String tradeType);

    /**
     * 导出交易明细视图数据到CSV
     *
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return CSV文件内容
     */
    Result<String> exportTradeDetailsToCSV(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 导出交易明细视图数据到CSV（带过滤条件）
     *
     * @param cardId 卡号（可选，精确查询）
     * @param customerName 客户姓名（可选，模糊查询）
     * @param tradeType 交易类型（可选）
     * @param startTime 交易开始时间（可选）
     * @param endTime 交易结束时间（可选）
     * @param minAmount 最小金额（可选）
     * @param maxAmount 最大金额（可选）
     * @return CSV文件内容
     */
    Result<String> exportTradeDetailsToCSV(String cardId,
                                          String customerName,
                                          String tradeType,
                                          LocalDateTime startTime,
                                          LocalDateTime endTime,
                                          BigDecimal minAmount,
                                          BigDecimal maxAmount);
}
